<?php 
/**
 * 
 * Deze klasse laat alle bestanden zien in de huidige folder.
 * Tevens worden er ook specifieke bestands informatie meegegeven zoals;
 * Bestandsnaam, Bestandstype, Bestandsgrootte, en Datum laatst bewerkt
 * 
 * @author Ferry Guikema
 *
 */
class Explorer {
	
	/*** webfy ***/
	private $webfy;
	
	/*** huidige folder ***/
	private $currentDirPath;
	
	function __construct($webfy)
	{
		/*
		 * de webfy klasse
		 */
		$this->webfy = $webfy;
	} # ctor
	
	/**
	 * Return de huidige folder locatie
	 * 
	 * @return string (huidige folder)
	 */
	public function getCurrentDirPath()
	{
		return $this->webfy->settings->global['root_path'] .''. $this->currentDirPath;
	} # func getCurrentDir
	
	/**
	 * Zet de huidige folder locatie
	 * 
	 * @param String (path)
	 */
	public function changeDir($dir)
	{
		/*** explode de dir ***/
		$dirs = Explode('/', $dir);
		
		/*** nieuwe dir  ***/
		$newDir = '';
		
		/*** strip .. uit de dir path ***/
		foreach($dirs as $d) {
		  if ($d != '..' && $d != '')
		    $newDir .= '/' . $d;
		  elseif ($d == '..')
		    $newDir = substr($newDir, 0, strrpos($newDir, '/', -2));
		}

		/*** kijk of folder bestaat ***/
		if ( !is_dir( $this->webfy->settings->global['root_path'] .''. $newDir ) )
		{
			$this->webfy->out = Array('code' 	=> '0',
								 	  'melding'	=> $this->webfy->settings->explorer['nonexistent_dir']);
		}
		/*** bestaat folder, verander dan current dir ***/
		else 
		{
			$this->currentDirPath = $newDir;
			$this->listDir();
		}
	} # func changeDir

	
	/**
	 * Return de inhoud van een folder
	 * 
	 * @return array(string)
	 */
	public function listDir()
	{
		/*** array van alle bestanden ***/
		$files = array();
		
		/*** controleer gebruikers rechten ***/
		if ( !$this->webfy->usercontrol->hasRights($this->currentDirPath, 'read') )
		{
			$this->webfy->out = Array('code'	=> '0',
						  'melding'	=> $this->webfy->settings->userrights['read']);
		}
		/*** open de huidige folder ***/
		else if ( $handle = opendir($this->webfy->settings->global['root_path'] .'/'. $this->currentDirPath) )
		{		
			/*** loop door alle bestanden ***/
			while ( false != ( $file = readdir($handle) ) ) {	
				/*** Array met bestandsinformatie: [bestandsnaam, bestandstype, bestandsgrootte, laatstbewerkt(datum)] ***/	
				$files[] = Array('filename' => $file, 
								 'filetype' => $this->getFileType($file), 
								 'filesize' => $this->formatBytes( filesize($this->webfy->settings->global['root_path'] .'/'. $this->currentDirPath .'/'. $file) ), 
								 'modified' => date('H:i d M Y', filemtime($this->webfy->settings->global['root_path'] .'/'. $this->currentDirPath .'/'. $file) ),
								 'filepath' => $this->currentDirPath .'/'. $file);
			}
			/*** sluit folder ***/
			closedir( $handle );

			/*** sorteer op alfabetische volgorder ***/
			sort( $files );
				
			$this->webfy->out = $files;
		}

	} # func listDir
	
	/**
	 * Return de type van het bestand
	 * 
	 * 0 = unknown
	 * 1 = folder
	 * 2 = bestand
	 * 
	 * @param File $file
	 * @return int (bestandstype)
	 */
	public function getFileType($file)
	{

		/*** is het een folder? ***/
		if ( filetype($this->webfy->settings->global['root_path'] .'/'. $this->currentDirPath .'/'. $file) == 'dir' )
			return 1;
		/*** is het een bestand? ***/
		else if ( filetype($this->webfy->settings->global['root_path'] .'/'. $this->currentDirPath .'/'. $file) == 'file' && is_file($this->webfy->settings->global['root_path'] .'/'. $this->currentDirPath .'/'. $file) )
			return 2;
		
		return 0;
	} # func getFileType
	
	/**
	 * Return leesbare formaat van een bestands grootte
	 * 
	 * @param int $bytes
	 * @param int $precision
	 * @return String (bestands grootte)
	 */
	public function formatBytes($bytes, $precision = 2) {
		$units = array('bytes', 'kB', 'MB', 'GB', 'TB');
	
		$bytes = max($bytes, 0);
		$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
		$pow = min($pow, count($units) - 1);
	
		$bytes /= pow(1024, $pow);
	
		return round($bytes, $precision) . ' ' . $units[$pow];
	} # func formatBytes
}

?>
